package com.easyclearance.wxutils;

import java.io.UnsupportedEncodingException;
import java.security.AlgorithmParameters;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.Security;
import java.security.spec.InvalidParameterSpecException;
import java.util.Arrays;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import org.apache.log4j.Logger;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Base64;
import org.springframework.stereotype.Repository;

import com.alibaba.fastjson2.JSONObject;

@Repository
public class WxloginUtil {
	
		public static final Logger logger = Logger.getLogger(WxloginUtil.class);
//	   private static final String appid = "wx779756596b7a9d45";
//	   
//	   private static final String secret = "ebd2aedd6e8a6ef5f4d012899ac78437";
	   
	   //可获取openid及session_key,其实这里openid不需要获取，encryptedData解密后包含openid
	    public String get(String code) throws Exception {
	        //官方接口，需要自己提供appid，secret和js_code
	        String requestUrl = "https://api.weixin.qq.com/sns/jscode2session?appid="+PayConfigUtil.APP_ID+"&secret="+PayConfigUtil.APP_SECRET+"&js_code="+code+"&grant_type=authorization_code";
	        //HttpRequestor是一个网络请求工具类，贴在了下面
	        String oppid = new HttpRequestor().doGet(requestUrl);
//	        System.out.println("-----oppid--"+oppid+"----------");
//	        String requestUrl0 = "https://api.weixin.qq.com/sns/jscode2session";
//	        Map<String,String> map = new HashMap<String,String>();
//	        map.put("secret", PayConfigUtil.APP_SECRET);
//	        map.put("appid", PayConfigUtil.APP_ID);
//	        map.put("code", code);
	        //HttpRequestor是一个网络请求工具类，贴在了下面
//	        String oppid0 = new HttpRequestor().doPost(requestUrl0,map);
//	        System.out.println("-----oppid0--"+oppid0+"----------");
	        
	        
	        JSONObject oppidObj = JSONObject.parseObject(oppid);
//	        @SuppressWarnings("unused")
//			String openid = (String) oppidObj.get("openid");
	        String session_key = (String) oppidObj.get("session_key");
	        return session_key;
	    }
	    /**
	     * 获取信息
	     */
	    public JSONObject getUserInfo(String encryptedData,String sessionkey,String iv){
//	    	logger.error("encryptedData:"+encryptedData+",sessionkey:"+sessionkey+",iv:"+iv);
	        // 被加密的数据
	        byte[] dataByte = Base64.decode(encryptedData.replace("%3D","=").replace("%2F","/"));
	        // 加密秘钥
	        byte[] keyByte = Base64.decode(sessionkey.replace("%3D","=").replace("%2F","/"));
	        // 偏移量
	        byte[] ivByte = Base64.decode(iv.replace("%3D","=").replace("%2F","/"));
	        try {
	               // 如果密钥不足16位，那么就补足.  这个if 中的内容很重要
	            int base = 16;
	            if (keyByte.length % base != 0) {
	                int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);
	                byte[] temp = new byte[groups * base];
	                Arrays.fill(temp, (byte) 0);
	                System.arraycopy(keyByte, 0, temp, 0, keyByte.length);
	                keyByte = temp;
	            }
	            // 初始化
	            Security.addProvider(new BouncyCastleProvider());
	            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding","BC");
	            SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");
	            AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
	            parameters.init(new IvParameterSpec(ivByte));
	            cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化
	            byte[] resultByte = cipher.doFinal(dataByte);
	            if (null != resultByte && resultByte.length > 0) {
	                String result = new String(resultByte, "UTF-8");
	                return JSONObject.parseObject(result);
	            }
	        } catch (NoSuchAlgorithmException e) {
	            e.printStackTrace();
	        } catch (NoSuchPaddingException e) {
	            e.printStackTrace();
	        } catch (InvalidParameterSpecException e) {
	            e.printStackTrace();
	        } catch (IllegalBlockSizeException e) {
	            e.printStackTrace();
	        } catch (BadPaddingException e) {
	            e.printStackTrace();
	        } catch (UnsupportedEncodingException e) {
	            e.printStackTrace();
	        } catch (InvalidKeyException e) {
	            e.printStackTrace();
	        } catch (InvalidAlgorithmParameterException e) {
	            e.printStackTrace();
	        } catch (NoSuchProviderException e) {
	            e.printStackTrace();
	        }
	        return null;
	    }
		public static void main(String[] args) {
			JSONObject userInfo = new WxloginUtil().getUserInfo("7lCec96UCptw17tE61vNlI2S9N0cNeNhBFdFl8cxISpFu33Lrroaq2LpUpqjtm3UdEU+S2QLt/fxUi66r4RMdqKedRanTtdgHS5gGlwkm9yJYKhdpfaUOP3us6UKaxxdouI8qTgzIsBul7WIzEEJl90zgtK2aAZ3ftirPGBBbLUSZxu0SKOa6PtppaZTRMsE7ovMvR1ZPu5kwSMHsa7g3u/yKa6xuIbgqLiwXTKUqGRSo/IbgVFCkPjKQLUt0dVkevVQFg6HeYiTcnZ24c0y7DAsB5w4fH8XNnGlDH+y8XnHJPHHatfm0Ojz4YcAMqBkGWpz/4whQdMEqdZbDRc1s3L+ypO1XnY3/w6aKEeRbDUVvvsPvwJR4/AFwrhndgM05jIMdNCmkeycLPxzaWdTaVTZo5tGFZhmZg+S+eaCFavRRHbnDzKaYy8Kxwa+6cVvqfZBY7me3FLK4n0/tvV+Aw==", "REAvTv4zmQhARCGOGFerNQ==", "R1x4EcNPaBbpanGZsE2qyg==");
			System.out.println(userInfo);
		}
}
